ECS CLIでAmazon ECSを操作してみた #reinvent
はじめに
AWS re:Invent 2015 Keynote 2でWarnerから発表された新機能の一つに、Amazon EC2 Container Service(Amazon ECS)のCLI、ECS CLIがあります。
このECS CLI、Docker Composeに対応しており、Composeと同じ操作でAmazon ECSを操作することができます。
ということで、早速ECS CLIを試してみました!
やってみた
ECS CLIのインストール
今回使っている環境はAmazon Linuxです。以下のようにecs-cliコマンドをダウンロードします。
$ sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-latest
ダウンロードしたコマンドに実行権限をつけます。
$ sudo chmod +x /usr/local/bin/ecs-cli $ which ecs-cli /usr/local/bin/ecs-cli
AWS環境にアクセスするためのアクセスキーは、環境変数として持つか、ecs-cli configureで指定するか、通常のAWS CLIを使用する際に認証情報を設定するaws configureで設定するか、の3パターンです。今回はaws configureで設定しておきました。
$ aws configure
ECSクラスタを作成する
ecs-cli configureによって、リージョンとECSクラスタ名を指定します。
$ ecs-cli configure --region ap-northeast-1 --cluster my-ecs-cluster INFO[0000] Saved ECS CLI configuration for cluster (my-ecs-cluster)
ecs-cli upコマンドでECSクラスタを起動します。
$ ecs-cli up --keypair YOUR_KEYPAIR --capability-iam --size 2 --instance-type t2.medium INFO[0000] Created cluster cluster=my-ecs-cluster INFO[0000] Waiting for your cluster resources to be created INFO[0001] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS INFO[0061] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS INFO[0121] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS INFO[0181] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
以下のようにECSクラスタが作成され、2台のECSインスタンスが起動しました。
Composeでタスクを動かす
以下のようなDocker Compose用のYAMLファイルを作成しました。
$ vi wordpress.yml wordpress: image: wordpress ports: - "80:80" links: - mysql mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password
このYAMLファイルを指定して、ecs-cli composeコマンドでupします。
$ ecs-cli compose --file wordpress.yml up INFO[0000] Using ECS task definition TaskDefinition=ecscompose-ec2-user:1 INFO[0000] Starting container... container=X-X-X-X-X/wordpress INFO[0000] Starting container... container=X-X-X-X-X/mysql INFO[0000] Describe ECS container status container=X-X-X-X-X/wordpress desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-ec2-user:1 INFO[0000] Describe ECS container status container=X-X-X-X-X/mysql desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-ec2-user:1 INFO[0060] Started container... container=X-X-X-X-X/wordpress desiredStatus=RUNNING lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1 INFO[0060] Started container... container=X-X-X-X-X/mysql desiredStatus=RUNNING lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1
AWS管理コンソールで確認すると、タスクが出来たことが分かります。
ecs-cli psコマンドで確認すると、wordpressとmysqlの2つのコンテナが起動していることがわかります!
$ ecs-cli ps Name State Ports TaskDefinition X-X-X-X-X/wordpress RUNNING 52.69.211.XXX:80->80/tcp ecscompose-ec2-user:1 X-X-X-X-X/mysql RUNNING ecscompose-ec2-user:1
実際にWebブラウザでwordpressコンテナにアクセスすると、WordPressのログイン画面が表示されます。
タスクをスケールさせる
このタスクをスケールさせてみます。ecs-cli composeコマンドで、scaleオプションを2と指定します。
$ ecs-cli compose --file wordpress.yml scale 2
ecs-cli psコマンドで確認すると、wordpressとmysqlがそれぞれ2台ずつにスケールしています。
$ ecs-cli ps Name State Ports TaskDefinition X-X-X-X-X/mysql RUNNING ecscompose-ec2-user:1 X-X-X-X-X/wordpress RUNNING 54.178.193.XXX:80->80/tcp ecscompose-ec2-user:1 Y-Y-Y-Y-Y/wordpress RUNNING 52.69.211.XXX:80->80/tcp ecscompose-ec2-user:1 Y-Y-Y-Y-Y/mysql RUNNING ecscompose-ec2-user:1
ECSサービスとして定義する
タスクで動作を検証し、問題無ければ、今度はECSサービスとして登録します。まずは今上がっているタスクをダウンさせます。
$ ecs-cli compose --file wordpress.yml down INFO[0000] Stopping container... container=Y-Y-Y-Y-Y/mysql INFO[0000] Stopping container... container=Y-Y-Y-Y-Y/wordpress INFO[0000] Stopping container... container=X-X-X-X-X/wordpress INFO[0000] Stopping container... container=X-X-X-X-X/mysql INFO[0000] Describe ECS container status container=Y-Y-Y-Y-Y/mysql desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1 INFO[0000] Describe ECS container status container=Y-Y-Y-Y-Y/wordpress desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1 INFO[0000] Describe ECS container status container=X-X-X-X-X/wordpress desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1 INFO[0000] Describe ECS container status container=X-X-X-X-X/mysql desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1 INFO[0006] Stopped container... container=Y-Y-Y-Y-Y/mysql desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1 INFO[0006] Stopped container... container=Y-Y-Y-Y-Y/wordpress desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1 INFO[0006] Stopped container... container=X-X-X-X-X/wordpress desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1 INFO[0006] Stopped container... container=X-X-X-X-X/mysql desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1
ecs-cli psで確認。全てのコンテナがSTOPPEDとなっていますね。
$ ecs-cli ps Name State Ports TaskDefinition X-X-X-X-X/mysql STOPPED ExitCode: 0 ecscompose-ec2-user:1 X-X-X-X-X/wordpress STOPPED ExitCode: 0 ecscompose-ec2-user:1 Y-Y-Y-Y-Y/wordpress STOPPED ExitCode: 0 ecscompose-ec2-user:1 Y-Y-Y-Y-Y/mysql STOPPED ExitCode: 0 ecscompose-ec2-user:1
AWS管理コンソールからもタスクが削除されました。
次に、ecs-cli composeコマンドで、タスクで検証していたファイルを指定し、service upオプションで実行します。
$ ecs-cli compose --file wordpress.yml service up INFO[0000] Using ECS task definition TaskDefinition=ecscompose-ec2-user:1 INFO[0000] Created an ECS Service serviceName=ecscompose-service-ec2-user taskDefinition=ecscompose-ec2-user:1 INFO[0000] Updated ECS service successfully desiredCount=1 serviceName=ecscompose-service-ec2-user INFO[0000] Describe ECS Service status desiredCount=1 runningCount=0 serviceName=ecscompose-service-ec2-user INFO[0030] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=ecscompose-service-ec2-user
AWS管理コンソールで確認。サービスとして追加されました!
ecs-cli psコマンドで確認すると、コンテナが2つ起動しています。
$ ecs-cli ps Name State Ports TaskDefinition Z-Z-Z-Z-Z/wordpress RUNNING 54.178.193.188:80->80/tcp ecscompose-ec2-user:1 Z-Z-Z-Z-Z/mysql RUNNING ecscompose-ec2-user:1
ECSサービスを削除する
さて、最後に削除してみます。ecs-cli composeコマンドでservice rmオプションをつけて実行します。
$ ecs-cli compose --file wordpress.yml service rm INFO[0000] Updated ECS service successfully desiredCount=0 serviceName=ecscompose-service-ec2-user INFO[0000] Describe ECS Service status desiredCount=0 runningCount=1 serviceName=ecscompose-service-ec2-user INFO[0030] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=ecscompose-service-ec2-user INFO[0030] Deleted ECS service service=ecscompose-service-ec2-user INFO[0030] ECS Service has reached a stable state desiredCount=0 runningCount=0 serviceName=ecscompose-service-ec2-user
AWS管理コンソールから確認。ECSサービスが無くなりました。
ECSクラスタを停止する
ecs-cli downコマンドを実行します。
$ ecs-cli down --force INFO[0000] Waiting for your cluster resources to be deleted INFO[0000] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0061] Cloudformation stack status stackStatus=DELETE_IN_PROGRESS INFO[0121] Deleted cluster cluster=my-ecs-cluster
ECSクラスタに含まれていたECSインスタンスが無くなりました。
これで綺麗さっぱり掃除が終わりました。
さいごに
Docker Composeと同じ操作でAmazon ECSが操作できるということは、ローカル検証環境ではSwarm + Compose、本番環境ではAmazon ECS + Compose、というように、より近い形で検証環境と本番環境を操作できるようになります。すでにComposeを使っているDockerユーザであれば簡単にAmazon ECSが使えるようになりました。GUIにアクセスしなくてもCUIで簡単にECSクラスタが作れてサービスが起動できる、これは便利です!